package com.tth.learn.addproperties.java2;

import com.tth.learn.addproperties.java1.Person;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * @Author tth
 * @Date 2023/1/3 16:46
 */
public class StreamAPITest2 {

    /**
     * Stream的筛选与切片
     */
    @Test
    public void test1() {
        List<Person> persons = Person.getPersons();

        // 练习：查询员工中薪资超过6000的员工，并打印
        persons.stream().filter(p -> p.getSalary() > 6000).forEach(System.out :: println);

        System.out.println("***********************************************************************");

        // 练习：截断流，使其元素不超过指定元素
        persons.stream().limit(3).forEach(System.out :: println);

        System.out.println("***********************************************************************");

        // 练习：跳过元素，返回一个扔掉了前n个元素的流。若流中元素不足n个，则返回一个空流。与limit(n)互补
        persons.stream().skip(3).forEach(System.out :: println);

        System.out.println("***********************************************************************");

        // 练习：筛选，通过流元素生成的hasCode()和equals()去除重复元素
        persons.stream().distinct().forEach(System.out :: println);
    }

    @Test
    public void test2() {
        List<Person> persons = Person.getPersons();

        // 练习：获取员工姓名长度大于3的人员的姓名
        persons.stream().filter(e -> e.getName().length()>3).map(Person::getName).forEach(System.out :: println);
    }

    /**
     * <R> Stream<R> map(Function f) 和
     */
    @Test
    public void test2_1() {
        List<String> list = Arrays.asList("aa", "bb", "cc", "dd");
        Stream<Stream<Character>> stream1 = list.stream().map(StreamAPITest2::fromStringToStream);
        stream1.forEach(s -> {
            s.forEach(System.out :: println);
        });

        System.out.println("********************************************");

        Stream<Character> stream2 = list.stream().flatMap(StreamAPITest2::fromStringToStream);
        stream2.forEach(System.out :: println);

    }

    /**
     * 将字符串str中的多个字符构成的集合转换为Stream实例。
     *  即将字符串str转成Stream实例
     * @param str
     * @return
     */
    public static Stream<Character> fromStringToStream(String str) {
        ArrayList<Character> list = new ArrayList<>();
        for(Character c : str.toCharArray()) {
            list.add(c);
        }
        return list.stream();
    }

    @Test
    public void test3() {
        // 练习：通过sorted()实现自然排序
        List<Integer> list = Arrays.asList(12, 3, 99, 10, 78, 67, 88);
        list.stream().sorted().forEach(System.out :: println);

        // 练习：通过sorted(Comparator comparator)实现定制排序
        List<Person> persons = Person.getPersons();
        persons.stream().sorted(((o1, o2) -> {
            int compare = Integer.compare(o1.getAge(), o2.getAge());
            if (compare != 0) {
                return compare;
            } else {
                return Double.compare(o1.getSalary(), o2.getSalary());
            }
        })).forEach(System.out :: println);
    }
}
